using System;
using System.Collections.Generic;
using System.Text;
using NEXEntidad;
using NEXServicio;
using System.Data;

namespace NEXEntidad
{
    #region Categoria
    public class Categoria : NEXEntidadElemento
    {
        #region Constructores
        public Categoria(int idCategoria)
            : base(idCategoria)
        {
            this.Id = idCategoria;
        }
        public Categoria()
            : base()
        {
        }
        #endregion

        #region Campos/Propiedades

        //String fDescripcion;
        //public String Descripcion
        //{
        //    get
        //    {
        //        return fDescripcion;
        //    }
        //    set
        //    {
        //        fDescripcion = value;
        //    }
        //}

        bool fActivo;
        public bool Activo
        {
            get
            {
                return fActivo;
            }
            set
            {
                fActivo = value;
            }
        }

        int? fIdPadre;
        public int? IdPadre
        {
            get
            {
                return fIdPadre;
            }
            set
            {
                fIdPadre = value;
            }
        }

        int? fIdAbuelo;
        public int? IdAbuelo
        {
            get
            {
                return fIdAbuelo;
            }
            set
            {
                fIdAbuelo = value;
            }
        }

        String fDescripcionCompleta;
        public String DescripcionCompleta
        {
            get { return fDescripcionCompleta; }
            set { fDescripcionCompleta = value; }
        }


        #endregion

        #region Metodos de Carga
        internal static Categoria Crear(DataRow dataRow)
        {
            Categoria categoria = new Categoria(Convert.ToInt32(dataRow["IdCategoria"].ToString(), System.Globalization.CultureInfo.CurrentCulture));
            return categoria;
        }
        internal static Categoria Crear(DataRow dataRow, bool dataRowSolapado)
        {
            String nombreSolapado = !dataRowSolapado ? "" : "Categoria_";
            Categoria categoria = new Categoria();
            categoria.Id = Convert.ToInt32(dataRow["IdCategoria"].ToString(), System.Globalization.CultureInfo.CurrentCulture);
            categoria.IdAbuelo = (dataRow[nombreSolapado + "IdAbuelo"] != DBNull.Value) ? (int?)dataRow[nombreSolapado + "IdAbuelo"] : null;
            categoria.IdPadre = (dataRow[nombreSolapado + "IdCategoriaPadre"] != DBNull.Value) ? (int?)dataRow[nombreSolapado + "IdCategoriaPadre"] : null;
            return categoria;
        }
        private static CategoriaCollection CrearListaCargada(System.Data.DataRowCollection dataRowCollection)
        {
            CategoriaCollection categorias = new CategoriaCollection();
            foreach (DataRow drCategoria in dataRowCollection)
            {
                categorias.Add(Categoria.CrearCargado(drCategoria, true));
            }
            return categorias;
        }

        internal static Categoria CrearCargadoCompleto(System.Data.DataRow drCategoria)
        {
            return CrearCargadoCompleto(drCategoria, false);
        }

        internal static Categoria CrearCargadoCompleto(System.Data.DataRow drCategoria, Boolean dataRowSolapado)
        {
            String nombreSolapado = !dataRowSolapado ? "" : "Categoria_";
            Categoria categoria = new Categoria();
            Categoria.Cargar(categoria, drCategoria, dataRowSolapado);
            return categoria;
        }

        private static Categoria CrearCargado(DataRow drCategoria)
        {
            return CrearCargado(drCategoria, false);
        }

        private static Categoria CrearCargado(DataRow drCategoria, bool completo)
        {
            Categoria categoria = new Categoria();
            Categoria.Cargar(categoria, drCategoria);

            return categoria;
        }

        private static void Cargar(Categoria categoria, DataRow drCategoria)
        {
            Categoria.Cargar(categoria, drCategoria, false);
        }

        private static void Cargar(Categoria categoria, DataRow drCategoria, Boolean dataRowSolapado)
        {
            String nombreSolapado = !dataRowSolapado ? "" : "Categoria_";
            categoria.Id = Convert.ToInt32(drCategoria["IdCategoria"].ToString(), System.Globalization.CultureInfo.CurrentCulture);
            categoria.Descripcion = drCategoria[nombreSolapado + "Descripcion"].ToString();
            categoria.IdPadre = (drCategoria[nombreSolapado + "IdCategoriaPadre"] != DBNull.Value) ? (Int32?)drCategoria[nombreSolapado + "IdCategoriaPadre"] : null;
            categoria.IdAbuelo = (drCategoria[nombreSolapado + "IdAbuelo"] != DBNull.Value) ? (Int32?)drCategoria[nombreSolapado + "IdAbuelo"] : null;
            categoria.DescripcionCompleta = drCategoria[nombreSolapado + "DescCompleta"].ToString();

            categoria.ObjetoCargado();
        }

        protected override void Obtener()
        {
            using (DataSet ds = ServicioCategoria.Obtener(this.Id))
            {
                DataTable dtCategoria = ds.Tables[ServicioAutor.DataTableName];
                if (dtCategoria.Rows.Count > 0)
                {
                    DataRow drCategoria = dtCategoria.Rows[0];
                    Categoria.Cargar(this, drCategoria);
                }
                else
                {
                    throw new ObjetoInexistenteException("Categoria");
                }
            }
        }
        #endregion

        #region Metodos Publicos
        public static CategoriaCollection Listar()
        {
            return Categoria.CrearListaCargada(ServicioCategoria.Listar().Tables[ServicioCategoria.DataTableName].Rows);
        }
        public static CategoriaCollection ListarHijos(int idCategoria)
        {
            return Categoria.CrearListaCargada(ServicioCategoria.Listar(idCategoria).Tables[ServicioCategoria.DataTableName].Rows);
        }
        public override string ToString()
        {
            return this.DescripcionCompleta;
        }
        #endregion
    }
    #endregion

    #region CategoriaCollection

    [Serializable]
    public class CategoriaCollection : NEXCollection<Categoria>
    {
    }
    #endregion


}
